package com.ror.java.se.proxy;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyUtil {
    //给明星的对象创建一个代理
    //形参star：被代理的明星对象
    //返回值starProxy：给明星对象创建的代理
    public static Star proxyOf(BigStar bigStar) {
        //Proxy.newProxyInstance方法的参数：loader, interfaces, h
        //-ClassLoader loader参数：用于指定用哪个类加载器，去加载生成的代理类
        //-Class<?>[] interfaces参数：指定接口，这些接口用于指定生成的代理长什么，也就是有哪些方法
        //-InvocationHandler h参数：用来指定生成的代理对象要干什么事情
        return (Star) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(),
                new Class[]{Star.class},
                (proxy, mtd, args) -> {
                    if ("sing".equals(mtd.getName())) System.out.println("准备话筒");
                    else if ("dance".equals(mtd.getName())) System.out.println("准备场地");
                    System.out.println("收钱");
                    return mtd.invoke(bigStar, args);
                }
        );
    }
}
